/*========================================= * animatedModal.js * author: João Pereira * website: https://joaopereira.pt * email: joaopereirawd@gmail.com * Licensed MIT =========================================*/ (function($) { $.fn.animatedModal = function(options) { var modal = $(this); var modalTarget = modal.attr('href').replace('#', ''); // Defaults var closeBt = $('#' + modalTarget).find('[data-modal-close]'); function getScrollBarWidth() { var $outer = $('
').css({ visibility: 'hidden', width: 100, overflow: 'scroll' }).appendTo('body'), widthWithScroll = $('
').css({ width: '100%' }).appendTo($outer).outerWidth(); $outer.remove(); return 100 - widthWithScroll; } var settings = $.extend({ modalTarget: modalTarget, position: 'fixed', width: '100%', height: '100%', top: '0px', left: '0px', zIndexIn: '9999', zIndexOut: '-9999', opacityIn: '1', opacityOut: '0', animatedIn: 'fadeIn', animatedOut: 'fadeOut', animationDuration: '.2s', // Callbacks beforeOpen: function() { $('html').css('overflowY', 'scroll'); $('html').add(closeBt).css('marginRight', '0'); $('#' + modalTarget).css('overflowY', 'hidden'); }, afterOpen: function() { $('html').css('overflowY', 'hidden'); $('html').add(closeBt).css('marginRight', getScrollBarWidth()); $('#' + modalTarget).css('overflowY', 'scroll'); }, beforeClose: function() { $('html').css('overflowY', 'scroll'); $('html').add(closeBt).css('marginRight', '0'); $('#' + modalTarget).css('overflowY', 'hidden'); }, afterClose: function() {} }, options); //console.log(closeBt) var href = $(modal).attr('href'), id = $('body').find('#' + settings.modalTarget), idConc = '#' + id.attr('id'); //console.log(idConc); // Default Classes id.addClass('animated'); id.addClass(settings.modalTarget + '-off'); //Init styles var initStyles = { 'position': settings.position, 'width': settings.width, 'height': settings.height, 'top': settings.top, 'left': settings.left, 'z-index': settings.zIndexOut, 'opacity': settings.opacityOut, '-webkit-animation-duration': settings.animationDuration, '-moz-animation-duration': settings.animationDuration, '-ms-animation-duration': settings.animationDuration, 'animation-duration': settings.animationDuration }; //Apply stles id.css(initStyles); modal.click(function(event) { event.preventDefault(); if (href == idConc) { if (id.hasClass(settings.modalTarget + '-off')) { id.removeClass(settings.animatedOut); id.removeClass(settings.modalTarget + '-off'); id.addClass(settings.modalTarget + '-on'); } if (id.hasClass(settings.modalTarget + '-on')) { settings.beforeOpen(); id.css({ 'opacity': settings.opacityIn, 'z-index': settings.zIndexIn }); id.addClass(settings.animatedIn); id.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', afterOpen); }; } }); closeBt.click(function(event) { event.preventDefault(); settings.beforeClose(); //beforeClose if (id.hasClass(settings.modalTarget + '-on')) { id.removeClass(settings.modalTarget + '-on'); id.addClass(settings.modalTarget + '-off'); } if (id.hasClass(settings.modalTarget + '-off')) { id.removeClass(settings.animatedIn); id.addClass(settings.animatedOut); id.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', afterClose); }; }); function afterClose() { id.css({ 'opacity': settings.opacityOut, 'z-index': settings.zIndexOut }); settings.afterClose(); //afterClose } function afterOpen() { settings.afterOpen(); //afterOpen } }; // End animatedModal.js }(jQuery));